#!/usr/bin/env python
# coding: utf-8
"""
@deprecated: 直接使用 onshs.BaseCase, 不推荐直接导入该模块.
"""

import logging
import os
import sys
import time
import imp

# from onshs import spec
from . import spec
# from .spec import OptionParser

class BaseCase (object) :
    """ 所有 Case 必须从该基类继承.
    """
    
    def __init__(self) :
        ''' 初始化函数.
        
        派生类必须使用 BaseCase.__init__(self) 来初始化基类
        '''

        # logger configurations
        logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s %(levelname)-8s %(name)-16s : %(message)s',
                        # filemode='w')
                        )        
        try :
            if os.environ['ONSHS_USE_SUITE_INIT']=='True':
                self.suite_init()
        except :
            pass
            
        self.__parse_arg()
    
    def get_case_name(self) :
        return os.path.splitext(os.path.split(sys.argv[0])[1])[0]
    
    def suite_init(self) :
        path = os.path.split(sys.argv[0])[0]
        fp, pathname, description =imp.find_module('suite',[path])
        suite_mod = imp.load_module('suite',fp,pathname,description)
        
        suite = suite_mod.TestSuite()
        suite.init()
        
    def __parse_arg(self) :
        self.opt_parser = spec.OptionParser()
        
        for opt in self.OPTIONS :        
            if opt['required'] :
                self.opt_parser.add_option(opt['opt'],dest=opt['dest'],
                                       metavar=opt['metavar'],
                                       help=opt['help'],
                                       required=opt['required']
                                      )
            else :
                self.opt_parser.add_option(opt['opt'],dest=opt['dest'],
                                       metavar=opt['metavar'],
                                       help=opt['help'],
                                       required=opt['required'],
                                       default=opt['default']
                                      )
        
        argv = []
        append_next_arg = False
        # print (sys.argv)
        for i in range(1, len(sys.argv)) :
            arg = sys.argv[i]
            
            # print (i, arg) #, arg_next)
            
            if arg=='--help' or arg=='-h' :
                argv.append(arg)
                break
            
            for opt in self.OPTIONS :
                if arg == opt['opt']:
                    #print arg
                    argv.append(arg)
                    try :
                        argv.append(sys.argv[i+1])
                    except :
                        pass
        
        # print argv
        options,args = self.opt_parser.parse_args(argv)
        
        self.options = options
        """ 存放命令行选项的值.
        
        self.options.dest 引用命令行选项的值, 如:
          {
            'opt' : '--ne1.ip',
            'dest': 'ne1_ip',
            'metavar' : 'IP',
            'help' : 'the IP address of net element 1',
            'required' : True,
          }
        
        self.options.ne1_ip 用于引用 --ne1.ip 传入的选项值
        """
        
        self.args = args
        # print self.options
        
        case_name = self.get_case_name()
        self.logger = logging.getLogger(case_name) # logs will print to stdout.
    
    def execute(self) :
        ''' 测试脚本的执行入口, 抽象接口.
        
        通常情况下, 用户脚本只需要实现该接口, 书写具体测试代码, 并使用
        xxx_exit() 等函数正确退出脚本即可.
        '''
        
        abstract
    
    def error_exit(self) :
        ''' 错误退出
        
        当 case 出错, 比如捕获了异常,
        或是命令行选项需要传入 'True' 或 'False', 实际传入的却是 'None' 等,
        使用该函数退出
        '''
        sys.exit(1101)
        
    def succ_exit(self) :
        ''' 测试成功退出
        
        用于在 `case` 测试成功时 (即对网元/仪表的测试并得到期望的结果)
        退出脚本.
        '''
        
        sys.exit(0)
        
    def failed_exit(self) :
        ''' 测试失败退出
        
        用于在 case 测试失败时 (即对网元/仪表的测试没有得到期望的结果) 
        退出脚本
        '''
        
        sys.exit(1100)
        
    def exit(self,retcode) :
        ''' 自定义退出
        
        retcode 是程序退出码.
        @deprecated: 非特殊情况下不推荐, 请使用 xxx_exit() 函数, 以便 HeavySmoker 能
        对返回值进行分类处理.
        '''
        
        sys.exit(retcode)
        
    def auto_pause(self) :
        # if os.environ.has_key('ONSHS_SEMI_AUTO'):
        if 'ONSHS_SEMI_AUTO' in os.environ:
            if os.environ['ONSHS_SEMI_AUTO'].lower()=="true" or os.environ['ONSHS_SEMI_AUTO']=='1':
                print ("press ENTER to continue ... ")
                sys.stdout.flush()
                # if raw_input("") :
                if input(""):
                    pass


if __name__ == "__main__" :
    case = BaseCase()
    case.execute()
    